; 启动扇区 硬盘（软盘）第一个扇区 512字节 被加载到内存0x7c00处
[org 0x7c00]
KERNEL_OFFSET equ 0x1000 ; 内核加载地址

jmp after_bpb
nop
times 59 db 0
after_bpb:
cli
jmp 0:real_start
real_start:
; 将段寄存器置0 防止随机值导致程序异常
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
; 栈基址 由高位到低位增长 可用0x8000-0x7c00-512=512字节
mov bp, 0x8000
mov sp, bp
sti


; 到第二和第三个扇区上加载内核
mov bx, MSG_LOAD_KERNEL
call print
call print_nl
mov dh, 31    ; 扇区数量
mov bx, KERNEL_OFFSET ; 内加载到这里
call disk_load

; 进入保护模式 启用gdt 之后bios中断无法使用
mov bx, MSG_ENTER_PM
call print
call print_nl
call switch_to_pm
jmp $

%include "boot/print.asm"
%include "boot/disk.asm"
%include "boot/gdt.asm"
%include "boot/switch_pm.asm"

[bits 32]
BEGIN_PM:
    call KERNEL_OFFSET ; 控制权交给内核
    jmp $
MSG_LOAD_KERNEL:
    db "start load kernel", 0
MSG_ENTER_PM:
    db "start enter protected mode", 0



; 填充0
times 510 - ($ - $$) db 0

; bios魔术数 以0x55aa结尾的扇区才会被bios视为启动扇区
; 小端序 编译时将低位字节放到内存低地址 编译后的文件内容为55aa
dw 0xaa55
